package cn.gjxblog.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

/**
 * 作用:
 * 作者:gjx
 * 版本:V1.0
 * 创建时间: 2018/7/26 22:49
 */
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     *
     * @param username
     * @param password
     * @param rememberMe 记住我标记
     * @return
     */
    @RequestMapping("/login")
    public String login(String username,String password,boolean rememberMe){
        //在web环境中安全管理器会自动进行初始化
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(username,password,rememberMe));
            return "redirect:/main.jsp";
        }catch (UnknownAccountException e){
            e.printStackTrace();
            return "redirect:/login.jsp";
        }catch (IncorrectCredentialsException e){
            e.printStackTrace();
            return "redirect:/login.jsp";
        }catch (AuthenticationException e) {
            e.printStackTrace();
            return "redirect:/login.jsp";
        }
    }

    /**
     * shiro提供了一套权限注解，控制方式是否可以访问
     *
     * 现象：注解失效
     *
     *  在访问之前，判断是否有调用访问方法的权限
     *
     *   aop:判断权限+原始方法
     *   动态代理方式
     *   1. jdk（默认） 基于接口
     *   2. cglib 基于接口或者类
     *
     * @throws
     *   异常如何处理，通过Spring全局异常处理
     * @return
     */
    @RequestMapping("/queryAll")
    @ResponseBody
    @RequiresRoles({"root","admin"})
    public String queryAll(){
        System.out.println("-----授权验证----");
        return "success";


    }
}
